home *** CD-ROM | disk | FTP | other *** search
/ Shareware Grab Bag / Shareware Grab Bag.iso / 090 / cmln0186.arc / CROSSTH2.LTG < prev    next >
Text File  |  1986-12-20  |  2KB  |  54 lines

  1.  
  2.  
  3.  
  4.                            Listing 2.  
  5.              PPL code for the concurrent quicksort.
  6.  
  7.  
  8. EXPLICITLY RECURSIVE 
  9. NONEXCLUSIVELY CONCURRENT PROCEDURE QuikSort(VAR L : array of data records;
  10.                                                  Left, Right : integer);
  11.  
  12. BEGIN
  13.    Priority = 1; Num_Slave_CPU = 1 -- This is a global identifier
  14.    I = Left; J = Right;
  15.    INITIALIZE: Median = L[(Left + Right) DIV 2)]
  16.    LOOP <Outer>
  17.    BEGIN
  18.       INITIALIZE: 
  19.       LOOP <Incr_Left_Counter>
  20.       BEGIN IF L[I].Key >= Median.Key THEN EXIT END IF
  21.            I += 1
  22.       END LOOP <Incr_Left_Counter> 
  23.       TERMINATE: None
  24.       
  25.       INITIALIZE: 
  26.       LOOP <Decr_Right_Counter>
  27.       BEGIN IF Median.Key >= L[J].Key THEN EXIT END IF
  28.            J -= 1
  29.       END LOOP <Dicr_Right_Counter> 
  30.       TERMINATE: None
  31.       IF I <= J THEN Swap records L[I] and L[J]
  32.                      I += 1; J -= 1
  33.       END IF
  34.       IF I > J THEN EXIT <Outer> END IF
  35.    END LOOP <Outer>
  36.    TERMINATE: None
  37.  
  38.    IF Left < J THEN 
  39.       IF Num_Slave_CPU < MAX_CPU 
  40.       THEN Num_Slave_CPU += 1; 
  41.         StartProcedure(QuickSort(L,Left,J),Priority,Signal[Num_Slave_CPU])
  42.       ELSE QuickSort(L,Left,J) END IF
  43.    END IF   
  44.  
  45.    IF I < Right THEN 
  46.       IF Num_Slave_CPU < MAX_CPU 
  47.       THEN Num_Slave_CPU += 1; 
  48.         StartProcedure(QuickSort(L,I,Right),Priority,Signal[Num_Slave_CPU])
  49.       ELSE QuickSort(L,I,Right) END IF
  50.    END IF
  51.    
  52.    Wait for pending signals
  53. END QuickSort
  54.